<?php

declare (strict_types=1);

namespace magein\pay\data;

/**
 * 通知类：通知所需要的各个参数
 */
class NoticeData
{
    /**
     * 控制是否发送支付结果通知
     * @var bool
     */
    private $ok = true;

    /**
     * 订单交易编号，传递给第三方平台的，不能为空且唯一
     * @var string
     */
    private $pay_no = '';

    /**
     * 第三方交易平台生成的订单编号
     * @var string
     */
    private $trade_no = '';

    /**
     * 支付结果
     * @var int
     */
    private $result = 0;

    /**
     * 失败原因
     * @var string
     */
    private $reason = '';

    /**
     * 交易类型 一般第三方聚合支付使用
     * @var string
     */
    private $trade_type = '';

    /**
     * 第三方交易平台通知时间
     * @var string
     */
    private $notify_date = '';

    /**
     * 异步通知的原始参数
     * @var string|array
     */
    private $notify_data = '';

    /**
     * 通知类型
     * notify 异步通知
     * return 同步通知
     * @var string
     */
    private $notify_type = '';

    /**
     * 给第三方平台的响应内容
     * 如：支付宝返回success 、 微信返回xml
     */
    private $response = null;

    public function isOk(): bool
    {
        return $this->ok;
    }

    public function setOk(bool $ok): void
    {
        $this->ok = $ok;
    }

    /**
     * @return string
     */
    public function getPayNo(): string
    {
        return $this->pay_no;
    }

    /**
     * @param string $pay_no
     */
    public function setPayNo(string $pay_no): void
    {
        $this->pay_no = $pay_no;
    }

    public function getTradeNo(): string
    {
        return $this->trade_no ?: '';
    }

    /**
     * @param string $trade_no
     */
    public function setTradeNo(string $trade_no): void
    {
        $this->trade_no = $trade_no;
    }

    /**
     * @return int
     */
    public function getResult(): int
    {
        return $this->result;
    }

    /**
     * @param int $result
     */
    public function setResult(int $result): void
    {
        $this->result = $result;
    }

    /**
     * @return string
     */
    public function getReason(): string
    {
        return $this->reason;
    }

    /**
     * @param string $reason
     */
    public function setReason(string $reason): void
    {
        $this->reason = $reason;
    }

    /**
     * @return string
     */
    public function getNotifyDate(): string
    {
        return $this->notify_date ?: date('Y-m-d H:i:s');
    }

    /**
     * @param string $notify_date
     */
    public function setNotifyDate(string $notify_date): void
    {
        $this->notify_date = $notify_date;
    }

    /**
     * @return string
     */
    public function getTradeType(): string
    {
        return $this->trade_type;
    }

    /**
     * @param string $trade_type
     */
    public function setTradeType(string $trade_type): void
    {
        $this->trade_type = $trade_type;
    }

    /**
     * @return string|array
     */
    public function getNotifyData()
    {
        return $this->notify_data;
    }

    /**
     * @param string|array $notify_data
     */
    public function setNotifyData($notify_data): void
    {
        $this->notify_data = $notify_data;
    }

    /**
     * @return mixed
     */
    public function getResponse()
    {
        return $this->response;
    }

    /**
     * @param  $response
     */
    public function setResponse($response): void
    {
        $this->response = $response;
    }

    /**
     * 设置支付成功
     * @return void
     */
    public function success()
    {
        $this->result = 1;
    }

    /**
     * 设置支付失败
     * @param string $reason
     * @return void
     */
    public function fail(string $reason = '')
    {
        $this->result = -1;
        if ($reason) {
            $this->setReason($reason);
        }
    }

    public function getNotifyType(): string
    {
        return $this->notify_type;
    }

    public function setNotifyType(string $notify_type): void
    {
        $this->notify_type = $notify_type;
    }
}